package org.zero.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.concurrent.TimeUnit;

/**
 * @author cnzeropro@qq.com
 * @date 2021/6/26
 */
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 视图跳转控制器
     * 无业务逻辑的跳转，均可以以这种方法写在这里
     *
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index").setViewName("index");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String[] statics = {
//                "/*.js",
//                "/*.css",
//                "/*.html",
//                "/*.htm",
//                "/js/**",
//                "/css/**",
//                "/img/**",
                "/**"
        };
        // 静态资源访问不拦截（转交给控制器处理）
        registry.addResourceHandler(statics)
                .addResourceLocations("classpath:/static/", "classpath:/templates/")
                .setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS).cachePublic());
    }

    /**
     * 设置跨域
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                // 可跨域地址
                .addMapping("/**")
                // 允许的源
                .allowedOrigins("http://localhost:8080/")
                // allowedOrigins（String…）的替代方案，它支持更灵活的模式，用于指定允许从浏览器进行跨源请求的源。
//                .allowedOriginPatterns()
                // 允许的方法
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许的请求头
                .allowedHeaders("*")
                // 允许是否携带 cookie 和 CSRF token（CSRF令牌）
                .allowCredentials(true)
                // 表明在3600秒内，不需要再发送预检验请求，可以缓存该结果
                .maxAge(3600L);
    }
}
